// create thread 创建线程
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
// 线程函数,指针函数
/* 使用 void* 作为参数和返回类型使得thread_fun可以是任何类型的函数。
 * 这样，线程启动时可以传递任何类型的数据给线程函数，线程函数也可以返回
 * 任何类型的数据（尽管在实际应用中，通常只使用 void* 来传递和返回指针）。
 */

int num = 15;
int lock = 0; // lock锁 0为解锁状态 1为上锁状态
void *thread_fun1();
void *thread_fun2();
int main()
{
    // 创建线程返回值
    int rtn1, rtn2;
    // 回收线程返回值
    int rtn;
    // 子线程id，即tid
    pthread_t thread_id1, thread_id2;
    // 创建线程1
    rtn1 = pthread_create(&thread_id1, NULL, thread_fun1, NULL);
    if (rtn1 != 0)
    {
        perror("线程1创建失败!");
        exit(1);
    }
    // 创建线程2
    rtn2 = pthread_create(&thread_id2, NULL, thread_fun2, NULL);
    if (rtn2 != 0)
    {
        perror("线程2创建失败!");
        exit(1);
    }
    while (1)
    {
        if (lock == 0)
        {
            lock = 1;
            printf("这是父进程,PID= %d 卖出第%d张票\n", getpid(), num);
            num--;
            lock = 0;
            sleep(2);
        }
        if (num == 0)
        {
            break;
        }
    }
    sleep(1);
    printf("回收线程1\n");
    rtn = pthread_join(thread_id1, NULL);
    printf("回收线程2\n");
    rtn = pthread_join(thread_id2, NULL);
    printf("父线程运行结束\n");
    return 0;
}
// 线程函数
void *thread_fun1()
{
    // 子线程id
    pthread_t new_thid;
    // 获取子线程id
    new_thid = pthread_self();
    while (1)
    {
        if (lock == 0)
        {
            lock = 1;
            printf("这是线程,TID = %u 卖出第%d张票\n", new_thid, num);
            num--;
            lock = 0;
            sleep(1);
        }
        else
        {
            sleep(2);
        }
        if (num == 0)
        {
            break;
        }
    }
    printf("线程TID=%u结束\n", new_thid);
    pthread_exit("线程结束");
}

void *thread_fun2()
{
    // 子线程id
    pthread_t new_thid;
    // 获取子线程id
    new_thid = pthread_self();
    while (1)
    {
        if (lock == 0)
        {
            lock = 1;
            printf("这是线程,TID = %u 卖出第%d张票\n", new_thid, num);
            num--;
            lock = 0;
            sleep(1);
        }
        else
        {
            sleep(2);
        }
        if (num == 0)
        {
            break;
        }
    }
    printf("线程TID=%u结束\n", new_thid);
    pthread_exit("线程结束");
}